/**
 *
 * Usuario : administrator
 * Creaci&oacute;n: 24/11/2005 - 11:30:34 AM
 * Cambios :
 *  Fecha | Autor  |  Cambios
 *  24/11/2005 | <a href = "mailto:AngelElectrico@PsiqueWare.com">Angel El&eacute;ctrico</a> | Creaci&oacute;n del Objeto.
 */

package com.psiqueware.alheli.seguridad;

import com.psiqueware.alheli.basico.BaseObjectInterface;

import java.util.List;

/**
 * {@link Agrupacion} de {@link Credencial}es cuya seguridad esta siendo administrada.
 * <br/>Paquete Original: com.psiqueware.basico.seguridad
 * <br/>Nombre  Original: Agrupacion
 * <br/><a href="AgrupacionK.java.html"><i>Ver C&oacute;digo Fuente</i> </a>
 *
 * @author <a href="mailto:AngelElectrico@psiqueware.com">Angel El&eacute;ctrico</a>
 * @version Revision: 1.1 24/11/2005 11:30:34 AM
 */
public interface Agrupacion extends BaseObjectInterface
{
    /**
     * {@link Permiso} para editar {@link Agrupacion}es.
     */
    public static final Permiso PERMISO = new Permiso("Permiso.Agrupacion",true);

    /**
     * Devuelve una copia de la lista de {@link Rol} que act&uacute;an sobre este {@link Agrupacion}.
     */
    List<Rol> listRoles();

    /**
     * Devuelve el {@link Rol} de esta {@link Agrupacion} para el nombre dado.
     *
     * @param nombre cadena con el {@link Rol}.
     *
     * @return el {@link Rol} de ese nombre en caso de encontrarlo; <code>null</code> en caso contrario.
     *
     * @noinspection CallToStringEquals
     */
    Rol buscaRolRegistrado(String nombre);

    /**
     * Devuelve una copia del listado {@code m_titulos}, que son propiedad del Presidente de la Agrupacion.
     *
     * @return un nuevo ArrayList<Titulo>.
     */
    List<Titulo> listTitulos();

    /**
     * Devuelve la Lista de los {@link Titulo} que son propiedad del Presidente de la Agrupacion.
     *
     * @return List(unmodifiable) de 'm_titulos'. <code>null</code> en caso de no existir.
     *
     * @see java.util.List
     */
    List<Titulo> getTitulos();

    /**
     * Nos dice si el {@link Titulo} se encuentra contenido en la
     * lista.
     *
     * @param o {@link Titulo} a buscar.
     *
     * @return <code>true</code> si lo encuentra; <code>false</code> en caso contrario.
     */
    boolean containsTitulo(Titulo o);

    /**
     * Nos dice si el {@link Rol} se encuentra contenido en la
     * lista.
     *
     * @param o {@link Rol} a buscar.
     */
    boolean containsRol(Rol o);

    /**
     * Buscamos los {@link Titulo}s de las {@link Propiedad}es dadas de alta con dicha clave. Lo devuelve solamente si el usuario es parte de esta {@link Agrupacion}.
     *
     * @param clave   de las propiedads cuyos {@link Titulo}s se buscan.
     * @param usuario que esta buscando el {@link Titulo}.
     *
     * @return List de {@link Titulo}s. En caso no existir y el usuario esta autorizado una lista vacia; en caso contrario <code>null</code>.
     *
     * @noinspection CallToStringEquals
     */
    List<Titulo> buscarTituloClavePropiedad(final String clave, UsuarioSeguridad usuario);


}
